import BaseXform from '../base-xform';

class DateXform extends BaseXform {
    constructor(options) {
        super();

        this.tag = options.tag;
        this.attr = options.attr;
        this.attrs = options.attrs;
        this._format =
            options.format ||
                function (dt) {
                    try {
                        if (Number.isNaN(dt.getTime())) {
                            return '';
                        }
                        return dt.toISOString();
                    } catch (e) {
                        return '';
                    }
                };
        this._parse =
            options.parse ||
                function (str) {
                    return new Date(str);
                };
    }

    render(xmlStream, model) {
        if (model) {
            xmlStream.openNode(this.tag);
            if (this.attrs) {
                xmlStream.addAttributes(this.attrs);
            }
            if (this.attr) {
                xmlStream.addAttribute(this.attr, this._format(model));
            } else {
                xmlStream.writeText(this._format(model));
            }
            xmlStream.closeNode();
        }
    }

    parseXmlObject(node) {
        if (node._name === this.tag) {
            if (this.attr) {
                this.model = this._parse(node._attributes[this.attr]);
            } else {
                let val = ""
                node._elements?.forEach((item) => {
                    val = item._text
                })
                this.model = this._parse(val);
            }
            return true
        }
        return false
    }

    parseOpen(node) {
        if (node.name === this.tag) {
            if (this.attr) {
                this.model = this._parse(node.attributes[this.attr]);
            } else {
                this.text = [];
            }
        }
    }

    parseText(text) {
        if (!this.attr) {
            this.text.push(text);
        }
    }

    parseClose() {
        if (!this.attr) {
            this.model = this._parse(this.text.join(''));
        }
        return false;
    }
}

export default DateXform;
